package pl.wroc.pwr.psi.controller;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import pl.wroc.pwr.psi.entity.ElementPlanu;
import pl.wroc.pwr.psi.entity.PytanieOtwarte;
import pl.wroc.pwr.psi.entity.SlowoKluczowe;
import pl.wroc.pwr.psi.entity.SlowoKluczoweToPytanieOtwarte;
import pl.wroc.pwr.psi.entity.Szablon;
import pl.wroc.pwr.psi.service.DefinicjaSynonimowService;
import pl.wroc.pwr.psi.service.ElementPlanuService;
import pl.wroc.pwr.psi.service.PytanieOtwarteService;
import pl.wroc.pwr.psi.service.SzablonService;

import com.google.gson.Gson;

@Controller
public class PytaniaOtwarteDefinicjaSynonimowController {

	@Autowired
	private PytanieOtwarteService pytaniaOtwarteService;

	@Autowired
	private SzablonService szablonService;

	@Autowired
	private DefinicjaSynonimowService definicjaSynonimowService;

	@Autowired
	private ElementPlanuService elementPlanuService;
	
	@RequestMapping("/szablony/usunskp")
	public @ResponseBody String usunSlowoKluczoweZPytania(@RequestParam Integer skId, @RequestParam Integer pId) {
		System.out.println("Usuwa sk: " + skId + " z pytania " + pId);
		szablonService.usunSlowoKluczoweToPytanie(pId, skId);
		return "OK";

	}

	@RequestMapping("/szablony/pytaniaotwarte")
	public String pokazSzablony(Model model) {

		List<PytanieOtwarte> pytaniaOtwarte = pytaniaOtwarteService.findAllPytanieOtwarte();
		List<SlowoKluczowe> slowoKluczowes = definicjaSynonimowService.findAllSlowoKluczowe();
		List<ElementPlanu> elementPlanu = elementPlanuService.findAllElementPlanu();
		List<Szablon> szablony = szablonService.findAllSzablon();
		
		sortuj(pytaniaOtwarte);

		model.addAttribute("elementplanu", elementPlanu);
		model.addAttribute("pytaniaotwarte", pytaniaOtwarte);
		model.addAttribute("slowakluczowe", slowoKluczowes);
		model.addAttribute("szablony", szablony);
		model.addAttribute("szablons", szablonService.findAllSzablon());
		return "pytaniaotwarte";
	}

	private void sortuj(List<PytanieOtwarte> pytaniaOtwarte) {
		Collections.sort(pytaniaOtwarte, new Comparator<PytanieOtwarte>() {

			@Override
			public int compare(PytanieOtwarte o1, PytanieOtwarte o2) {
				return o1.getTresc().compareTo(o2.getTresc());
			}
		});
		
	}

	@RequestMapping("/szablony/dodajskdopytania")
	public @ResponseBody String dodajSlowoKluczoweDoPytania(@RequestParam Integer newSkId, @RequestParam Integer pId) {
		System.out.println("Dodano skId " + newSkId + " pId " + pId);

		String skJson = "";
		
		if (czyJuzDodane(newSkId, pId)) {
			skJson = new Gson().toJson("error");
		} else {
			SlowoKluczowe sk = szablonService.dodajSlowoKluczoweToPytanie(pId, newSkId);
		
			SlowoKluczoweTO skTO = new SlowoKluczoweTO();
			skTO.setId(sk.getId());
			skTO.setNazwa(sk.getNazwa());
			
			skJson = new Gson().toJson(skTO);
			
			System.out.println(skJson);
		}

		return skJson;
	}

	private boolean czyJuzDodane(Integer newSkId, Integer pId) {
		PytanieOtwarte pytanie = pytaniaOtwarteService.findPytanieOtwarteById(pId);
		System.out.println(pId);
		System.out.println(pytanie);
		System.out.println(pytanie.getSlowoKluczowes());
		for (SlowoKluczoweToPytanieOtwarte skpo : pytanie.getSlowoKluczowes()) {
			if (skpo.getSlowoKluczowe().getId().equals(newSkId)) {
				return true;
			}
		}
		return false;
	}
	
	private class SlowoKluczoweTO {
		private Integer id;
		private String nazwa;
		
		public Integer getId() {
			return id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getNazwa() {
			return nazwa;
		}
		public void setNazwa(String nazwa) {
			this.nazwa = nazwa;
		}
		
		
	}
}
